﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using Sicoagro.Models;
using System.Net;
using System.IO;
using System.Web.Script.Serialization;
using System.Text;

namespace Sicoagro.Controllers
{
    public class AdministradorController : Controller
    {

        private List<Ofertante> ObtenerOfertantes(string tipo)
        {
            string url = "http://localhost:17719/Ofertantes.svc/Ofertantes/listar/" + tipo;

            HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
            req.Method = "GET";
            HttpWebResponse res = null;

            res = (HttpWebResponse)req.GetResponse();
            StreamReader reader = new StreamReader(res.GetResponseStream());
            string ofertanteJson = reader.ReadToEnd();
            JavaScriptSerializer js = new JavaScriptSerializer();
            List<Ofertante> resultado = js.Deserialize<List<Ofertante>>(ofertanteJson);
            return resultado;
        }

        private Ofertante ObtenerDatosOfertante(int id)
        {
            string url = "http://localhost:17719/Ofertantes.svc/Ofertantes/" + id;

            HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
            req.Method = "GET";
            HttpWebResponse res = (HttpWebResponse)req.GetResponse();
            StreamReader reader = new StreamReader(res.GetResponseStream());
            string alumnoJson = reader.ReadToEnd();
            JavaScriptSerializer js = new JavaScriptSerializer();
            Ofertante alumnoObtenido = js.Deserialize<Ofertante>(alumnoJson);

            return alumnoObtenido;
        }

        private List<Contratante> CrearContratantes()
        {
            List<Contratante> contratantes = new List<Contratante>();
            contratantes.Add(new Contratante() { CodContratante = 1, TipoDocContratante = "dni", NumDocContratante = "10525252", RazonSocial = "Contratante Numero1", EmailContratante = "contratante1@ec.pe", NumTelefContratante = "992758106", StdRegistro = 0 });
            contratantes.Add(new Contratante() { CodContratante = 2, TipoDocContratante = "dni", NumDocContratante = "03212163", RazonSocial = "Contratante Numero2", EmailContratante = "contratante2@ec.pe", NumTelefContratante = "4932448", StdRegistro = 0 });
            contratantes.Add(new Contratante() { CodContratante = 3, TipoDocContratante = "dni", NumDocContratante = "47478579", RazonSocial = "Contratante Numero3", EmailContratante = "contratante3@ec.pe", NumTelefContratante = "998542100", StdRegistro = 1 });
            contratantes.Add(new Contratante() { CodContratante = 4, TipoDocContratante = "ruc", NumDocContratante = "10451285751", RazonSocial = "Contratante Numero4", EmailContratante = "contratante4@ec.pe", NumTelefContratante = "5201212", StdRegistro = 1 });
            contratantes.Add(new Contratante() { CodContratante = 5, TipoDocContratante = "ruc", NumDocContratante = "10762637481", RazonSocial = "Contratante Numero5", EmailContratante = "contratante5@ec.pe", NumTelefContratante = "995637222", StdRegistro = 2 });

            return contratantes;
        }
        
        private List<Contratante> ObtenerContratantes(string tipo)
        {

            WSFContratante.ContratantesClient proxy = new WSFContratante.ContratantesClient();
            WSFContratante.Contratante[] contratantesProxy = proxy.ListarContratantesAdmin(tipo);
            
            List<Contratante> contratantes = null;

            foreach (var item in proxy.ListarContratante())
            {
                contratantes.Add(new Contratante { CodContratante = item.Codigo, TipoDocContratante = item.DocIdentidad, NumDocContratante = item.NumDocumento, EmailContratante = item.EMail, UsuarioContratante = item.Usuario, ClaveContratante = item.Password, RazonSocial = item.Razon_Social, DepContratante = item.Departamento, ProvContratante = item.Provincia, DistContratante = item.Distrito, DirecContratante = item.Direccion, NumTelefContratante = item.Telefono });

            }

            return contratantes;
        }

        private Contratante ObtenerContratanteAprobar(int codigo)
        {
            List<Contratante> contratantes = (List<Contratante>)Session["contratantes"];
            Contratante model = contratantes.Single(delegate(Contratante contratante)
            {
                if (contratante.CodContratante == codigo) return true;
                else return false;
            });

            return model;
        }


        //
        // GET: /Administrador/

        public ActionResult Index()
        {
            return View();
        }

        //
        // GET: /Administrador/OfertantesPendientesAprobacion
        public ActionResult OfertantesPendientesAprobacion()
        {
            List<Ofertante> model = ObtenerOfertantes("0");
            return View(model);
        }

        //
        // GET: /Administrador/OfertanteAprobarDetalle/5

        public ActionResult OfertanteAprobarDetalle(int id)
        {
            Ofertante model = ObtenerDatosOfertante(id);
            return View(model);
        }

        //
        // GET: /Administrador/OfertanteAprobar/5

        public ActionResult OfertanteAprobar(int id)
        {
            try
            {
                //List<Ofertante> ofertantes = (List<Ofertante>)Session["ofertantes"];
                Ofertante ofertante = ObtenerDatosOfertante(id);
                ofertante.StdRegistro = 1;
                ofertante.DscRechazo = "Aprobado por el administrador";
                StringBuilder jsonLista = new StringBuilder();
                JavaScriptSerializer js = new JavaScriptSerializer();
                js.Serialize(ofertante, jsonLista);
                string postdata = jsonLista.ToString();
                string url = "http://localhost:17719/Ofertantes.svc/Ofertantes";

                byte[] data = Encoding.UTF8.GetBytes(postdata);
                HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
                req.Method = "PUT";
                req.ContentLength = data.Length;
                req.ContentType = "application/json";
                var reqStream = req.GetRequestStream();
                reqStream.Write(data, 0, data.Length);
                var res = (HttpWebResponse)req.GetResponse();
                StreamReader reader = new StreamReader(res.GetResponseStream());

                return RedirectToAction("OfertantesPendientesAprobacion");
            }
            catch
            {
                return View();
            }
        }

        //
        // GET: /Administrador/OfertantesPendientesAprobacion
        public ActionResult OfertantesPendientesBloqueo()
        {
            List<Ofertante> model = ObtenerOfertantes("2");
            return View(model);
        }

        //
        // GET: /Administrador/OfertanteBloqueoDetalle/5

        public ActionResult OfertanteBloqueoDetalle(int id)
        {
            Ofertante model = ObtenerDatosOfertante(id);
            return View(model);
        }

        //
        // GET: /Administrador/OfertanteBloquear/5

        public ActionResult OfertanteBloquear(int id)
        {
            try
            {
                Ofertante ofertante = ObtenerDatosOfertante(id);
                ofertante.StdRegistro = 3;
                ofertante.DscRechazo = "Rechazado por el administrador";
                StringBuilder jsonLista = new StringBuilder();
                JavaScriptSerializer js = new JavaScriptSerializer();
                js.Serialize(ofertante, jsonLista);
                string postdata = jsonLista.ToString();
                string url = "http://localhost:17719/Ofertantes.svc/Ofertantes";

                byte[] data = Encoding.UTF8.GetBytes(postdata);
                HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
                req.Method = "PUT";
                req.ContentLength = data.Length;
                req.ContentType = "application/json";
                var reqStream = req.GetRequestStream();
                reqStream.Write(data, 0, data.Length);
                var res = (HttpWebResponse)req.GetResponse();
                StreamReader reader = new StreamReader(res.GetResponseStream());
                return RedirectToAction("OfertantesPendientesBloqueo");
            }
            catch
            {
                return View();
            }
        }

        //
        // GET: /Administrador/ContratantesPendientesAprobacion
        public ActionResult ContratantesPendientesAprobacion()
        {
            if (Session["contratantes"] == null)
                Session["contratantes"] = CrearContratantes();
            //List<Contratante> model = (List<Contratante>)Session["contratantes"];
            List<Contratante> model = ObtenerContratantes("0");

            return View(model);
        }

        //
        // GET: /Administrador/ContratanteAprobarDetalle/5

        public ActionResult ContratanteAprobarDetalle(int id)
        {
            Contratante model = ObtenerContratanteAprobar(id);
            return View(model);
        }

        //
        // GET: /Administrador/ContratanteAprobar/5

        public ActionResult ContratanteAprobar(int id)
        {
            try
            {
                List<Contratante> ofertantes = (List<Contratante>)Session["contratantes"];
                Contratante contratante = ObtenerContratanteAprobar(id);
                contratante.StdRegistro = 1;      
                return RedirectToAction("ContratantesPendientesAprobacion");
            }
            catch
            {
                return View();
            }
        }

        //
        // GET: /Administrador/ContratantesPendientesBloqueo
        public ActionResult ContratantesPendientesBloqueo()
        {
            if (Session["contratantes"] == null)
                Session["contratantes"] = CrearContratantes();
            List<Contratante> model = ObtenerContratantes("2");

            return View(model);
        }

        //
        // GET: /Administrador/ContratanteBloqueoDetalle/5

        public ActionResult ContratanteBloqueoDetalle(int id)
        {
            //Usaremos temporalmente la misma funcionalidad de aprobar
            Contratante model = ObtenerContratanteAprobar(id);
            return View(model);
        }

        //
        // GET: /Administrador/ContratanteBloquear/5

        public ActionResult ContratanteBloquear(int id)
        {
            try
            {
                List<Contratante> contratantes = (List<Contratante>)Session["contratantes"];
                contratantes.Remove(ObtenerContratanteAprobar(id));
                return RedirectToAction("ContratantesPendientesBloqueo");
            }
            catch
            {
                return View();
            }
        }
    }
}
